package com.breeze.components.message.delay.holder;

import com.breeze.components.message.delay.msg.DelayMessage;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.TimeUnit;
import org.redisson.api.RDelayedQueue;

/**
 * 延迟队列持有者
 *
 * @author breeze
 */
public interface DelayQueueHolder {

  /**
   * 添加延迟任务
   *
   * @param value 值
   * @param delay 延迟时间
   * @param timeUnit 时间单位
   * @param queueName 队列名称
   */
  void addJob(Object value, long delay, TimeUnit timeUnit, String queueName);

  /**
   * 添加延迟任务
   *
   * @param value 值
   * @param delayTime 到期时间
   * @param queueName 队列名称
   */
  void addJob(Object value, LocalDateTime delayTime, String queueName);

  /**
   * 移除延迟任务
   *
   * @param t 值
   * @param queueName 队列名称
   * @param classType 类型
   * @return 是否成功
   */
  <T extends DelayMessage> List<T> removeJob(String queueName, T t, Class<T> classType);

  void destroyQueue(String queueName);

  /**
   * 获取延迟任务队列
   *
   * @param queueName 队列名称
   * @return 延迟队列
   */
  BlockingDeque<String> getQueue(String queueName);

  /**
   * 队列获取值
   *
   * @param queueName 队列名称
   * @return 值
   */
  String take(String queueName) throws Exception;

  RDelayedQueue<String> initDelayQueue(String queueName);
}
